shadow dirty-VRAM: avoid multiple remove_all_mappings calls.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 26 Oct 2009 12:18:50 +0000 (12:18 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 26 Oct 2009 12:18:50 +0000 (12:18 +0000)
sh_remove_all_mappings() will walk roughly half of the shadow L1
tables for each MFN it's called with; calling it for every MFN in a
guest's framebuffer can be _very_ expensive, especially with the
shadow lock held across the whole operation.  Avoid that by just
blowing away all the shadows.

Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
xen/arch/x86/mm/shadow/common.c

index 577d97a696af0ff3b1d9f3017cb1f0b87fb3bd8e..becf32566f9c717874fc78b0a827e206c8be4f94 100644 (file)
@@ -3637,12 +3637,9 @@ int shadow_track_dirty_vram(struct domain *d,
      * no need to be careful. */
     if ( !dirty_vram )
     {
-        /* Just recount from start. */
-        for ( i = begin_pfn; i < end_pfn; i++ ) {
-            mfn_t mfn = gfn_to_mfn(d, i, &t);
-            if (mfn_x(mfn) != INVALID_MFN)
-                flush_tlb |= sh_remove_all_mappings(d->vcpu[0], mfn);
-        }
+        /* Throw away all the shadows rather than walking through them 
+         * up to nr times getting rid of mappings of each pfn */
+        shadow_blow_tables(d);
 
         gdprintk(XENLOG_INFO, "tracking VRAM %lx - %lx\n", begin_pfn, end_pfn);